package cn.edu.qfnu.common.dao;

import cn.edu.qfnu.common.exception.db.NoRecordFoundException;
import cn.edu.qfnu.common.paginate.Pagination;
import org.hibernate.criterion.DetachedCriteria;

import java.io.Serializable;
import java.util.List;

public interface BaseDao<T, ID extends Serializable> {

    /**
     * 向数据库中添加记录
     * @param entity 要添加的记录
     */
    void save(T entity);

    /**
     * 通过ID删除数据库中的数据
     * @param id 查询信息
     */
    void removeById(ID id);

    /**
     * 通过对象删除数据库中的数据
     * @param entity  要删除的对象
     */
    void remove(T entity);

    /**6
     * 通过对象传入，向数据库中更新数据
     * @param entity  要更新的对象
     */
    void saveOrUpdate(T entity);

    /**
     * 以get方式查询指定Id的记录，不使用二级缓存
     * @param id 指定ID
     * @return 返回查询结果
     */
    T get(ID id);

    /**
     * 以load方式查询指定ID的记录，使用二级缓存
     * @param id 指定ID
     * @return 返回查询结果
     * @throws NoRecordFoundException 找不到记录
     */
    T load(ID id) throws NoRecordFoundException;

    void merge(T entity);

    List<T> query();

    List<T> queryPagedListByDetachedCriteria(DetachedCriteria detachedCriteria, Pagination pagination);

    List<T> queryByDetachedCriteria(DetachedCriteria detachedCriteria);

}
